﻿/**
 * 作为DAP的server
 * pattern专用的DAP协议
 */
#pragma once

#include "dap/session.h"

class PatternDAP_Server {
 public:
  /**
   * pattern server构造函数
   * @param port 监听的端口号
   */
  explicit PatternDAP_Server(int port = 19528);

 private:
  /**
   * server报错时的回调函数
   * @param msg 错误的消息
   */
  static void onError(const char* msg);

  /**
   * 当有新的客户端连接请求
   * @param socket 客户端连接时的socket
   */
  void onClientConnected(const std::shared_ptr<dap::ReaderWriter>& socket);

  /********************** client连接时进行注册的接口 ************************/
  /**
   * client最开始发起的请求,服务端会将服务端支持的功能传递给client
   * @param session client连接时的会话句柄
   */
  static void initializeRequest(std::shared_ptr<dap::Session> session);

  /**
   * client开始调试,发起launch动作
   * @param session client连接时的会话句柄
   */
  static void launchRequest(std::shared_ptr<dap::Session> session);

  /**
   * 替换所有已有的函数断点,并设置新的函数断点
   * @param session client连接时的会话句柄
   */
  static void setFunctionBreakPointsRequest(
      std::shared_ptr<dap::Session> session);

  /**
   * 替换所有已有的指令断点,并设置新的指令断点
   * @param session client连接时的会话句柄
   */
  static void setInstructionBreakpointsRequest(
      std::shared_ptr<dap::Session> session);

  /**
   * 设置异常断点，当调试目标程序抛出异常时，程序会暂停运行
   * @param session client连接时的会话句柄
   */
  static void setExceptionBreakPointsRequest(
      std::shared_ptr<dap::Session> session);

  /**
   * 替换所有已有的数据断点，并设置新的数据断点
   * @param session client连接时的会话句柄
   */
  static void setDataBreakpointsRequest(std::shared_ptr<dap::Session> session);

  /**
   * 通知调试适配器客户端已经完成了初始化
   * @param session client连接时的会话句柄
   */
  static void configurationDoneRequest(std::shared_ptr<dap::Session> session);

  /**
   * 从调试适配器获取所有线程的列表
   * @param session client连接时的会话句柄
   */
  static void threadsRequest(std::shared_ptr<dap::Session> session);

  /**
   * 从调试适配器获取指定线程的堆栈跟踪信息
   * @param session client连接时的会话句柄
   */
  static void stackTraceRequest(std::shared_ptr<dap::Session> session);

  /**
   * 从调试适配器获取指定栈帧的变量作用域
   * 客户端可以发送此请求以获取当前执行状态下指定栈帧的变量作用域信息,
   * 从而了解程序执行到该栈帧时,哪些变量是可访问的
   * @param session client连接时的会话句柄
   */
  static void scopesRequest(std::shared_ptr<dap::Session> session);

  /**
   * 检索给定变量引用的所有子变量
   * 可以使用它来获取指定变量的子变量，例如获取数组元素、对象属性等
   * @param session client连接时的会话句柄
   */
  static void variablesRequest(std::shared_ptr<dap::Session> session);

 private:
  // server监听的端口号
  int port_;
};
